<?php
if(!defined('IS_OK')){
	die('request bad');
}
	
	/**
	 * 应用类，用于实例化控制器
	 * 还有定义 一些外部引入目录
	 * 和调用实例的工具类
	 * @author Administrator
	 *
	 */
	class App{
		
		public static function run(){
			try{
				//初始化每个控制器
				self::init();
				//设置外部访问路径用于view中使用模板中使用
				self::setUrl();
				//自动载入类
				spl_autoload_register(array(__CLASS__,'autoload'));
				//创建Demo
				self::createDemo();
				//实例化相应的控制器
				self::appRun();
				
			}catch( IncludeException $e ){
				echo $e->getErrors();
			}catch( Exception $e){
				echo $e->getMessage();
			}
			
			
		}
		
		/**
		 * 实例化相应的控制器
		 */
		private static function appRun(){
			//如果没有传入任何c参数那么默认访问的是c=index
			$controller = isset($_GET['c'])?$_GET['c']:'index';
			//当前控制器
			define('CONTROLLER', $controller);
			//定义每个模板的公用头部
			define('APP_VIEW_HEAD',APP_VIEW_PATH.'/'.CONTROLLER.'/head.html');
			//如果没有传入任何a参数那么默认访问的是a=index
			$action = isset($_GET['a'])?$_GET['a']:'index';
			//当前控制器方法
			define('ACTION',$action);
			//组合控制器名字
			$c = $controller.'Controller';
			//实例化当前控制器
			$c = new $c;
			//调用控制器方法
			$c->$action();
		}
		
		/**
		 * 如果框架成功引入后，那么可以创建一个 demo
		 */
		private static function createDemo(){
			$cdemo = <<<cdemo
<?php
			/**
			 *  控制器演示文件，请继承Controller 
			 *  控制器名Controller 
			 */
			class IndexController extends Controller{
					public function index(){
						\$this->assign('data','恭喜您可以正常使用Lwbphp框架了！（：');
						\$this->display();
					}
			}
cdemo;
			$tdemo = <<<tdemo
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">    
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
		<meta charset='utf-8' />
		<title><{\$data}></title>
</head>
<body>
			<div style='font-family:微软雅黑;color:#333;background:#F8F8F8;padding:20px;width:1000px;margin:0 auto;height:500px;'>
			<h1><{\$data}></h1>
			</div>
</body>
</html>
tdemo;
			//先判断演示文件是否存在如果不存在那么就创建他
			$cpath = APP_CONTROLLER_PATH.'/IndexController.class.php';
			is_file($cpath) || file_put_contents($cpath, $cdemo);
			//模板目录判断是否存在不存在就创建
			$tpath = APP_VIEW_PATH.'/Index';
			is_dir($tpath) || mkdir($tpath,0777,true);
			//判断模板文件是否存在不存在就创建 
			$demoTpl = $tpath.'/index.html';
			is_file($demoTpl) || file_put_contents($demoTpl,$tdemo);
			
		}
		
		
		/**
		 * 类内部注册自动加载类
		 * @param string $className
		 */
		private static function autoload($className){
			//因为类名都为大写所以这里将类名控制器转为 大写
			$className = ucfirst($className);
			//判断当前的类是否一个控制器那么就加载APP_CONTROLLER_PATH路径中找
			if(strlen($className)>10 && substr($className, -10)=='Controller'){
				$path = APP_CONTROLLER_PATH.'/'.$className.'.class.php';
				if(!is_file($path)){
					//如果文件不存在那就抛出异常
					throw new IncludeException($path, '控制器不存在', 2);
				}
				include_once($path);
			}else if(strlen($className)>5 && substr($className, -5)=='Model'){
				$path = APP_MODEL_PATH.'/'.$className.'.class.php';
				
				if(!is_file($path)){
					throw new IncludeException($path, '模型不存在', 3);
				}
				include_once($path);
			}else{
				//否则 就是一个工具类
				$path = TOOL_PATH.'/'.$className.'.class.php';
				if(!is_file($path)){
					//如果工具类不存在那么也抛出异常
					throw new IncludeException($path, '工具类不存在', 3);
				}
				include_once($path);
			}
			
		}
		
		
		/**
		 * 设置外部路径用于View访问路径 
		 * http开头的路径 
		 */
		private static function setUrl(){
			//外部APP文件
			define('__APP__','http://'.$_SERVER['SERVER_NAME'].$_SERVER['SCRIPT_NAME']);
			//外部根目录
			define('__ROOT__',dirname(__APP__));
			//APP应用目录
			define('__APPDIR__',__ROOT__.'/'.APP_NAME);
			//定义视图
			define('__VIEW__',__APPDIR__.'/View');
			//定义公用目录
			define('__PUBLIC__',__VIEW__.'/Public');
			
			
		}
		
		
		/**
		 * 初始化所有控制器
		 */
		private static function init(){
			//合并配置项
			C(include CONFIG_FILE);
			if(!is_file(APP_CONFIG_FILE)){
				$str=<<<str
<?php
		return array();
?>
str;
				file_put_contents(APP_CONFIG_FILE, $str);
			}
			C(include APP_CONFIG_FILE);
			//开启session
			session(C('SESSION_OPEN'));
			//设置时区
			date_default_timezone_set(C('TIME_ZONE'));
		
			
		}
		
	}